home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / m68k / 68343ffp.arc / IEFCMP.SA < prev    next >
Text File  |  1989-08-30  |  10KB  |  189 lines

  1.        TTL     IEEE FORMAT EQUIVALENT COMPARE AND TEST (IEFCMP/IEFTST)
  2. ***************************************
  3. * (C) COPYRIGHT 1981 BY MOTOROLA INC. *
  4. ***************************************
  5.  
  6. *************************************************************
  7. *                     IEFCMP                                *
  8. *  FAST FLOATING POINT IEEE FORMAT EQUIVALENT COMPARE       *
  9. *                                                           *
  10. *          (RESULT IS TEST OF DESTINATION - SOURCE)         *
  11. *                                                           *
  12. *  INPUT:  D6 - IEEE FORMAT NUMBER (SOURCE)                 *
  13. *          D7 - IEEE FORMAT NUMBER (DESTINATION)            *
  14. *                                                           *
  15. *  OUTPUT: THE CONDITION CODE REGISTER IS SET TO DIRECTLY   *
  16. *           REFLECT THE FOLLOWING RESULTS OF THE TEST:      *
  17. *                                                           *
  18. *                  EQ         EQUAL                         *
  19. *                  NE         NOT EQUAL                     *
  20. *                  GT         GREATER THAN                  *
  21. *                  GE         GREATER THAN OR EQUAL         *
  22. *                  LT         LESS THAN                     *
  23. *                  LE         LESS THAN OR EQUAL            *
  24. *                  CC         ORDERED                       *
  25. *                  CS         UNORDERED                     *
  26. *                                                           *
  27. *      CONDITION CODES:                                     *
  28. *              N - SET FOR PROPER ARITHMETIC TESTS          *
  29. *              Z - SET IF RESULT IS ZERO                    *
  30. *              V - SET FOR PROPER ARITHMETIC TESTS          *
  31. *              C - SET IF RESULT IS UNORDERED               *
  32. *                  (NOT-A-NUMBER OPERAND)                   *
  33. *              X - UNDEFINED                                *
  34. *                                                           *
  35. *               ALL REGISTERS TRANSPARENT                   *
  36. *                                                           *
  37. *            MAXIMUM STACK USAGE:    32 BYTES               *
  38. *                                                           *
  39. *  NOTES:                                                   *
  40. *    1) THE UNORDERED CONDITION RESULTS WHENEVER ANY        *
  41. *       ARGUMENT IS A NAN (NOT-A-NUMBER).  THE CARRY BIT    *
  42. *       WILL BE RETURNED ON IF THIS OCCURS.  THIS IS        *
  43. *       DIFFERENT FROM MOST OF THE OTHER MC68344 IEEE FORMAT*
  44. *       EQUIVALENT OPERATIONS IN THAT THEY RETURN THE "V"   *
  45. *       BIT SET WHICH IS HANDY FOR USE OF THE "TRAPV"       *
  46. *       INSTRUCTION.  HOWEVER, "V" MUST BE USED HERE FOR THE*
  47. *       SIGNED ARITHMETIC COMPARISONS.                      *
  48. *    2) IEFCMP RECOGNIZES AND PROPERLY HANDLES ALL SINGLE-  *
  49. *       PRECISION IEEE FORMAT VALUES AND DATA TYPES.        *
  50. *    3) INFINITIES ARE HANDLED IN AFFINE MODE (PLUS AND     *
  51. *       MINUS INFINITIES ARE ALLOWED AND OPERATE WITH NON-  *
  52. *       INFINITIES).                                        *
  53. *                                                           *
  54. *************************************************************
  55.          PAGE
  56.  
  57. IEFCMP IDNT    1,3  IEEE FORMAT EQUIVALENT COMPARE/TEST
  58.  
  59.          OPT       PCS
  60.  
  61.          XREF      9:IEFDOP  DOUBLE ARGUMENT CONVERSION ROUTINE
  62.        XREF    FFPCPYRT        COPYRIGHT NOTICE
  63.  
  64.          SECTION  9
  65.          XDEF      IEFCMP    IEEE FORMAT COMPARE
  66.  
  67. CCRCBIT  EQU       $01       CONDITION CODE REGISTER "C" BIT MASK
  68.  
  69. ***********************
  70. * COMPARE ENTRY POINT *
  71. ***********************
  72. IEFCMP   MOVE.L    D7,-(SP)  SAVE CALLERS ORIGINAL D7
  73.          BSR.S     IEFCALL   CALL INTERNAL ROUTINE (NANS WILL RETURN HERE)
  74. * IF CONTROL RETURNS HERE IT WILL BE FROM IEFDOPT DETECTING A NAN
  75.          MOVE.L    (SP)+,D7  RESTORE ORIGINAL D7 IN CASE ARG1 NAN AND NOT ARG2
  76.          OR.B      #CCRCBIT,CCR  SET "C" BIT FOR UNORDERED (NAN ENCOUNTERED)
  77.          RTS                    RETURN TO CALLER WITH "C" SET
  78.  
  79. * INTERNAL SUBROUTINE.  SPLIT NAN'S AWAY VIA CALL TO IEFDOP.  IEFDOP WILL
  80. * DIRECTLY RETURN TO THE CODE ABOVE IF IT DETECTS EITHER OPERAND TO BE A NAN.
  81. IEFCALL  BSR       IEFDOP    DECODE BOTH OPERANDS
  82.          BRA.S     IEFNRM    +0 NORMALIZED RETURN (OR ZERO OR DENORMALIZED)
  83.          BRA.S     IEFINF2   +2 ARG2 INFNITY RETURN
  84.          BRA.S     IEFINF1   +4 ARG1 INFNITY RETURN
  85. *                                       +6 BOTH INFINITY RETURN
  86.  
  87. * BOTH VALUES ARE INFINITY.  WE CAN SUBSTITUTE +1 AND -1 VALUES FOR PLUS AND
  88. * MINUS INFINITY RESPECTIVELY, AND CONTINUE WITH A STRAIGHT ARITHMETIC COMPARE.
  89.          MOVE.L    #30,D5    SETUP SHIFT COUNT FOR SIGN PROPAGATION
  90.          ASR.L     D5,D7     CHANGE TO PLUS OR MINUS ONE
  91.          ASR.L     D5,D6     CHANGE TO PLUS OR MINUS ONE
  92.          BRA.S     IEFDOCMP  NOW FINISH WITH STANDARD ARITHMETIC COMPARE
  93.  
  94. * ARG2 IS INFINITY AND NOT ARG1 - SUBSTITUTE $80000000 (LOWEST BINARY VALUE)
  95. * FOR NEGATIVE INFINITY TO FORCE PROPER COMPARE
  96. IEFINF2  TST.L     D7        ? WAS THIS MINUS INFINITY
  97.          BPL.S     IEFINF2P  BRANCH IF OK TO COMPARE
  98.          LSL.L     #8,D7     CHANGE TO SMALLEST NEGATIVE NUMBER FOR COMPARE
  99. IEFINF2P BSR.S     IEFFIX1   RELOAD AND FIX ARG1 NEGATIVE ZEROES
  100.          BRA.S     IEFDOCMP  NOW FINISH WITH COMPARE
  101.  
  102. * ARG1 IS INFINITY AND NOT ARG2 - SUBSTITUTE $80000000 (LOWEST BINARY VALUE)
  103. * FOR NEGATIVE INFINITY TO FORCE PROPER COMPARE
  104. IEFINF1  TST.L     D6        ? WAS THIS MINUS INFINITY
  105.          BPL.S     IEFDARG2  BRANCH IF NOT, OK TO USE
  106.          LSL.L     #8,D6     SET TO SMALLEST NEGATIVE VALUE
  107.          BRA.S     IEFDARG2  RELOAD AND FIX ARG2 NEGATIVE ZEROES
  108.  
  109. * ALL NORMALIZED, DENORMALIZED, OR ZEROES RETURN HERE.
  110. * EXCEPT FOR MINUS ZEROES, A SIMPLE ARITHMETIC COMPARE CAN BE
  111. * DONE DIRECTLY ON THE ORIGINAL IEEE ARGUMENTS.  MINUS ZEROES ARE
  112. * CHANGED TO TRUE ARITHMETIC ZEROES.
  113. IEFNRM   BSR.S     IEFFIX1   LOAD AND FIX NEGATIVE ZEROES FOR FIRST ARGUMENT
  114. IEFDARG2 MOVE.L    16(SP),D7 RELOAD ARG2
  115.          ADD.L     D7,D7     TEST FOR PLUS OR MINUS ZERO
  116.          BEQ.S     IEFDOCMP  BR ZERO, USE TRUE ZERO FOR COMPARE
  117.          MOVE.L    16(SP),D7 RELOAD AND USE ORIGINAL VALUE
  118. IEFDOCMP TST.L     D6        ? ARG1 POSITIVE
  119.          BPL.S     IEFDOCP   BR POSITIVE
  120.          TST.L     D7        ? ARG2 POSITIVE
  121.          BPL.S     IEFDOCP   BR POSITIVE
  122.          EXG.L     D7,D6     BOTH NEGATIVE - DO REVERSE COMPARE
  123. IEFDOCP  CMP.L     D6,D7     PERFORM THE COMPARE (DESTINATION MINUS SOURCE)
  124.          AND.B     #$FF-CCRCBIT,CCR FORCE "C" BIT OFF FOR ORDERED COMPARE
  125.          MOVEM.L   (SP)+,D3-D7 RESTORE CALLERS ORIGINAL REGISTERS
  126.          ADD.L     #8,SP     SKIP OVER INTERNAL RETURN ADDRESS AND SAVED D7
  127.          RTS                 RETURN WITH ARITHMETIC COMPARE CONDITION CODE
  128.  
  129. * LOAD AND FIX ARGUMENT 1 FOR NEGATIVE ZEROES
  130. IEFFIX1  MOVE.L    12+4(SP),D6 RELOAD IT BACK
  131.          ADD.L     D6,D6     CHECK FOR PLUS OR MINUS ZERO
  132.          BEQ.S     IEFFIXR   RETURN IF ZERO TO USE TRUE ZERO
  133.          MOVE.L    12+4(SP),D6 RELOAD AND USE ORIGINAL VALUE
  134. IEFFIXR  RTS                 RETURN TO CALLER
  135.          PAGE
  136. *************************************************************
  137. *                     IEFTST                                *
  138. *  FAST FLOATING POINT IEEE FORMAT EQUIVALENT TEST          *
  139. *                                                           *
  140. *          (RESULT IS TEST OF DESTINATION MINUS ZERO)       *
  141. *                                                           *
  142. *  INPUT:  D7 - IEEE FORMAT NUMBER (DESTINATION)            *
  143. *                                                           *
  144. *  OUTPUT: THE CONDITION CODE REGISTER IS SET TO DIRECTLY   *
  145. *           REFLECT THE FOLLOWING RESULTS OF THE TEST:      *
  146. *                                                           *
  147. *                  EQ         EQUAL ZERO                    *
  148. *                  NE         NOT EQUAL ZERO                *
  149. *                  PL         POSITIVE VALUE                *
  150. *                  MI         NEGATIVE VALUE                *
  151. *                  VC         NOT A NAN (NOT-A-NUMBER)      *
  152. *                  VS         NAN (NOT-A-NUMBER)            *
  153. *                                                           *
  154. *      CONDITION CODES:                                     *
  155. *              N - SET IF NEGATIVE                          *
  156. *              Z - SET IF ZERO                              *
  157. *              V - SET IF NAN (NOT-A-NUMBER)                *
  158. *              C - UNDEFINED                                *
  159. *              X - UNDEFINED                                *
  160. *                                                           *
  161. *               ALL REGISTERS TRANSPARENT                   *
  162. *                                                           *
  163. *            TOTAL STACK USAGE:    24 BYTES                 *
  164. *                                                           *
  165. *  NOTES:                                                   *
  166. *    1) IEFCMP RECOGNIZES AND PROPERLY HANDLES ALL SINGLE-  *
  167. *       PRECISION IEEE FORMAT VALUES AND DATA TYPES.        *
  168. *                                                           *
  169. *************************************************************
  170.          PAGE
  171.  
  172.          XREF      9:IEFSOP  SINGLE ARGUMENT CONVERSION ROUTINE
  173.          XREF      9:IEFRTOD7 RETURN ORIGINAL D7 TO CALLER AS RESULT
  174.  
  175.          XDEF      IEFTST    IEEE FORMAT TEST
  176.  
  177. ********************
  178. * TEST ENTRY POINT *
  179. ********************
  180. IEFTST   BSR       IEFSOP    SEPARATE OUT NANS BACK TO CALLER
  181.          NOP                 +0 NORMALIZED ZERO OR DENORMALIZED
  182. *                                       +2 ARGUMENT WAS INFINITY
  183.  
  184. * MERELY RETURN WITH D7 AS THE RESULT. CCR WILL BE SET PROPERLY
  185.          BRA       IEFRTOD7   RETURN OLD ORIGINAL D7
  186.  
  187.          END
  188.  
  189.